home *** CD-ROM | disk | FTP | other *** search
- #ifdef __TURBOC__
- #include <conio.h>
- #else
- #include <graph.h>
- #endif
- #include <io.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include "db_types.h"
- #include "db_conio.h"
- #include "db_curs.h"
- #include "db_date.h"
- #include "db_dos.h"
- #include "db_file.h"
- #include "db_funcs.h"
- #include "db_heap.h"
- #include "db_gvar.h"
- #include "db_key.h"
- #include "db_lsc.h"
- #include "db_pswd.h"
- #include "db_sets.h"
- #include "db_str.h"
- #include "db_win.h"
- #include "db_mnu.h"
- #include "db_man.h"
- #include "db_util.h"
- #include "db_work.h"
-
- typedef struct {
- uchar exeid[9];
- byte deltat;
- } default_rec;
-
- default_rec def1 = {"öMB.EXE_",150};
-
- #define StartName "STARTMB"
-
- typedef char titstr[17];
- typedef struct savmtyp {
- pathstr savnam;
- byte savno;
- char savprompt[81];
- pathstr savpath;
- struct savmtyp *savprv;
- } savmtyp, *savmptr;
- typedef struct passwd_rec {
- long recstat;
- char operator[9];
- char sec_code[2];
- byte fill[5];
- } passwdrec;
-
- #ifdef __TURBOC__
- unsigned _stklen = 0x4000;
- #endif
-
- bool quit, pathSwap;
- byte autom;
- byte gb;
- byte ctlkey;
- int res,loop;
- mnufrec dm;
- itmtyp tmpitm;
- savmptr smc, svm;
- string autop;
- pathstr savdir, batchloop, tmpfilesdir;
-
- void rubpath(void)
- {
- string ts;
-
- if ((dm.basewin2 != NULL) && (mpath.x != 0)) {
- fillstr(ts,64,' ');
- writewxy(ts,0,mpath.x,mpath.y,dm.basewin2);
- }
- }
-
- void datenpath(void)
- {
- string ts;
-
- goodwrite = False;
- if ((mdate.x != 0) && (dm.basewin1 != NULL)) {
- if (mdate.m == 0)
- writewxy(datum(ts,sysdate(ts)),0,mdate.x,mdate.y,dm.basewin1);
- else
- writewxy(slash(ts,sysdate(ts)),0,mdate.x,mdate.y,dm.basewin1);
- }
- if ((mpath.x != 0) && (dm.basewin2 != NULL)) {
- rubpath();
- writewxy(datapath,0,mpath.x,mpath.y,dm.basewin2);
- }
- goodwrite = True;
- pathSwap = False;
- }
-
- void changeto(pathstr newpath, int *res)
- {
- *res = (changedir(newpath)) ? 0 : 1;
- if (*res == 0) {
- getcurrentdir(datapath,0);
- pathSwap = True;
- }
- }
-
- void loadmanual(void)
- {
- string nam;
-
- #ifndef DEBUG
- strip(nam,dm.mnufnam);
- strcopy(nam,nam,0,strlen(nam)-3);
- strcat(nam,"MAN");
- initmanual(nam);
- #endif
- }
-
- void newload(mnufrec *m, pathstr newmenu)
- {
- int i;
- pathstr newnam;
-
- #ifndef DEBUG
- strcpy(newnam,newmenu);
- svm = smc;
- smc = db_malloc(sizeof(savmtyp));
- smc->savprv = svm;
- strcpy(smc->savnam,m->mnufnam);
- smc->savno = m->curmnu->mno;
- strcpy(smc->savprompt,m->curitm->prompt);
- if (dm.curitm->selpath[0] != '\0') {
- getcurrentdir(smc->savpath,0);
- changeto(dm.curitm->selpath,&i);
- }
- else {
- i = 0;
- smc->savpath[0] = '\0';
- }
- if (i == 0) {
- disposemnus(&dm);
- strcpy(dm.mnufnam,newnam);
- initmnu(&dm,0,0,OnDisk);
- dispallwin();
- if (dm.curmnu == NULL) {
- if (smc->savpath[0] != '\0')
- changeto(smc->savpath,&i);
- strcpy(dm.mnufnam,smc->savnam);
- initmnu(&dm,0,0,OnDisk);
- dispallwin();
- jumptomnu(&dm,smc->savno);
- do
- dm.curitm = dm.curitm->nitm;
- while ((strcmp(smc->savnam,dm.curitm->prompt) != 0) &&
- (dm.curitm != dm.curmnu->fitm));
- db_free(smc);
- smc = svm;
- }
- else {
- loadmanual();
- dspmnu(&dm,dm.curmnu);
- }
- }
- else {
- db_free(smc);
- smc = svm;
- doserr(3,dm.curitm->selpath);
- }
- pathSwap = True;
- #endif
- }
-
- void erasebatch(void)
- {
- unlink(batchloop);
- }
-
- void savemnuchain(void)
- {
- bool tb;
- FILE *sfile;
- pathstr fname;
- string ts;
-
- #ifndef DEBUG
- strcpy(fname,"SAVCHAIN.");
- strcat(fname,strcopy(ts,getenvstr(ts,"MBSTN"),0,3));
- sfile = fopen(fname,"wb");
- tb = (bool) (smc != NULL);
- fwrite(datapath,1,sizeof(datapath),sfile);
- fwrite(savdir,1,sizeof(savdir),sfile);
- fwrite(gvar->operator,1,8,sfile);
- fwrite(&gvar->sec,1,1,sfile);
- fwrite(&tb,1,1,sfile);
- if (tb) {
- svm = smc;
- do {
- fwrite(svm,1,sizeof(savmtyp),sfile);
- svm = svm->savprv;
- } while (svm != NULL);
- }
- fclose(sfile);
- #endif
- }
-
- void restoremnuchain(void)
- {
- bool tb;
- int i;
- savmptr tsvm;
- FILE *sfile;
- pathstr tfnam;
- string ts;
-
- #ifndef DEBUG
- strcpy(tfnam,"SAVCHAIN.");
- strcat(tfnam,strcopy(ts,getenvstr(ts,"MBSTN"),0,3));
- sfile = fopen(tfnam,"rb");
- if (sfile != NULL) {
- fread(datapath,1,sizeof(datapath),sfile);
- fread(savdir,1,sizeof(savdir),sfile);
- fread(gvar->operator,1,8,sfile);
- fread(&gvar->sec,1,1,sfile);
- fread(&tb,1,1,sfile);
- if (tb) {
- do {
- tsvm = db_malloc(sizeof(savmtyp));
- fread(tsvm,1,sizeof(savmtyp),sfile);
- if (smc == NULL)
- smc = tsvm;
- else
- svm->savprv = tsvm;
- svm = tsvm;
- } while (!db_eof(sfile));
- svm->savprv = NULL;
- }
- fclose(sfile);
- unlink(tfnam);
- if (savdir[0] != '\0') {
- changeto(savdir,&i); savdir[0] = '\0';
- i = 0;
- }
- }
- #endif
- }
-
- strptr modestr(string sout)
- {
- strptr m;
-
- switch (origm) {
- case 0 : m = "BW40"; break;
- case 1 : m = "CO40"; break;
- case 2 : m = "BW80"; break;
- case 3 : m = "CO80"; break;
- case 7 : m = "MONO"; break;
- default : m = NULL; break;
- }
- if (m == NULL)
- sout[0] = '\0';
- else {
- strcpy(sout,"MODE ");
- strcat(sout,m);
- }
- return (sout);
- }
-
- void dummy_exec(string p, string c)
- {
- int i, slen;
- string tts;
-
- strcpy(gvar->reentry,dm.curitm->prompt);
- slen = strlen(gvar->reentry);
- for (i = 0; i < slen; i++) {
- if (gvar->reentry[i] == ' ') gvar->reentry[i] = '¿';
- }
- strconcat(gvar->reentry,dm.mnufnam," -AE",strip(tts,istr(tts,(long) dm.curmnu->mno,3))," ",gvar->reentry,NULL);
- strcpy(gvar->prog,p);
- strcpy(gvar->cmd,c);
- savemnuchain();
- if (dm.curitm->selwait == _YES) exit(98); else exit(99);
- }
-
- void writebatch(string batchstr, mnufrec *m)
- {
- bool wb;
- int p,tslen;
- string ts,tts;
- FILE *batf;
-
- #ifndef DEBUG
- wb = False;
- if ((batchloop[0] != '\0') && (batchstr[0] != '\0')) {
- wb = True;
- savemnuchain();
- batf = fopen(batchloop,"wt");
- fprintf(batf,"Echo Off\n");
- strcpy(ts,batchstr);
- while (strlen(ts) > 0) {
- p = strposch(';',ts);
- if (p >= 0) {
- mirt(tts,(strcopy(tts,ts,0,p))); strdelete(ts,0,p+1);
- }
- else {
- mirt(tts,ts); ts[0] = '\0';
- }
- wb = replmacro(tts);
- fprintf(batf,"%s\n",tts);
- }
- if (wb) {
- modestr(ts); if (ts[0] != '\0') fprintf(batf,"%s\n",ts);
- getcurrentdir(ts,0);
- fprintf(batf,"%s\n",strcopy(tts,ts,0,2));
- strdelete(ts,0,2);
- strcpy(tts,"CD"); fprintf(batf,"%s\n",strcat(tts,ts));
- strcpy(ts,m->curitm->prompt);
- tslen = strlen(ts);
- for (p = 0; p < tslen; p++)
- if (ts[p] == ' ') ts[p] = '¿';
- if (lcd) strcat(ts," -LCD");
- strip(tts,istr(tts,(long) m->curmnu->mno,3));
- fprintf(batf,"%s.BAT %s -AE%s %s\n",StartName,m->mnufnam,tts,ts);
- fprintf(batf,"cls\n");
- fclose(batf);
- }
- }
- if (wb) {
- closeallwin();
- clrscr();
- exit(0);
- }
- if (batchloop[0] == '\0')
- dberrm(strconcat(ts,LSC_StartVia," \"",StartName,".BAT\".",NULL));
- #endif
- }
-
- void do_proc(int procno, mnufrec *m)
- {
- switch (procno) {
- case -1 : break;
- }
- }
-
- void updpasswords(void)
- {
- byte b;
- string ts,cl,tts;
- uchar pic[2];
-
- #ifndef DEBUG
- if (gvar->sec > 0) {
- kflush();
- strcpy(ts,"1");
- if (gvar->sec == 9)
- dbgetstr(ts,_Num,LSC_PaswordChoices,"",chstr(pic,Pic_H),"",nocheck,nohelp);
- if (ts[0] == '2')
- updmaster();
- else {
- if (ts[0] == '1') {
- strconcat(tts,lookalong,";",datapath,NULL);
- fsearch(ts,"DB_PASW.EXE",tts);
- pointer2string(tts,dgvar);
- strconcat(cl,thisprog.fdir," ",recog,tts,NULL);
- if (ts[0] != '\0') {
- for (b = 0; b < MaxMnus; b ++) {
- if ((dm.mat[b] != NULL) && (dm.mat[b]->winp != NULL))
- closewin(&dm.mat[b]->winp);
- }
- clrscr();
- dummy_exec(ts,cl);
- clrscr();
- dispallwin();
- jumptomnu(&dm,dm.curmnu->mno);
- }
- }
- }
- }
- else
- dberrm(LSC_LogOn2Update);
- #endif
- }
-
- void do_ctl(mnufrec *m, itmptr itm)
- {
- byte b;
- int i;
- string ts,cl,tts;
-
- if ((m->curmnu != NULL) && (itm != NULL)) {
- if (((itm->seltyp==_Boss)||(itm->seltyp==_Cmd)||(itm->seltyp==_Exe)) &&
- (itm->selpath[0] != '\0')) {
- getcurrentdir(savdir,0); changeto(itm->selpath,&i);
- }
- else {
- savdir[0] = '\0'; i = 0;
- }
- if (i != 0)
- dberrm(DOSErr3);
- else {
- switch (itm->seltyp) {
- case _Help : itemhelp(m); break;
- case _Jump : jumptomnu(m,(byte) ival(itm->selact)); break;
- case _Run : newload(m,itm->selact); break;
- case _SetP :
- rubpath();
- editdatapath();
- pathSwap = True;
- break;
- case _Log :
- logon();
- for (b = 0; b < MaxMnus; b++) {
- if ((m->mat[b] != NULL) && (m->mat[b]->winp != NULL)) {
- zapmnu(m,m->mat[b]);
- dspmnu(m,m->mat[b]);
- }
- }
- break;
- case _UpdPW : updpasswords(); break;
- case _Menu :
- if ((ival(itm->selact) > 0) && (m->mat[(int) ival(itm->selact)-1] != NULL)) {
- if (m->mat[(int) ival(itm->selact)-1]->winp != NULL)
- jumptomnu(m,(byte) ival(itm->selact));
- else {
- m->mat[(int) ival(itm->selact)-1]->pmnu = m->curmnu->mno;
- m->curmnu = m->mat[(int) ival(itm->selact)-1];
- dspmnu(m,m->curmnu);
- m->curitm = m->curmnu->litm;
- m->level = 0;
- }
- }
- break;
- case _Boss :
- strconcat(tts,lookalong,";",datapath,NULL);
- fsearch(ts,strip(ts,itm->selact),tts);
- if (ts[0] == '\0')
- strcpy(ts,"NOTFOUND.EXE");
- if (*(strip(tts,itm->selcmd)) != '\0')
- strconcat(cl,datapath," ",trim(tts,itm->selcmd),NULL);
- else
- strip(cl,datapath);
- strconcat(cl,cl," ",recog,pointer2string(tts,dgvar),NULL);
- if (lcd) strcat(cl," -LCD");
- if (!ehk) strcat(cl," -K");
- if (replmacro(cl)) {
- for (b = 0; b < MaxMnus; b++) {
- if ((m->mat[b] != NULL) && (m->mat[b]->winp != NULL))
- closewin(&m->mat[b]->winp);
- }
- clrscr();
- dummy_exec(ts,cl);
- clrscr();
- dispallwin();
- jumptomnu(m,m->curmnu->mno);
- }
- break;
- case _WriteBat : writebatch(itm->selact,m); break;
- case _Exe :
- case _Cmd :
- case _Dos :
- exitcode = ' ';
- if ((*strip(tts,itm->selact) == '\0') || (strposch('*',itm->selact) >= 0) ||
- (strposch('?',itm->selact) >= 0)) {
- if (itm->seltyp != _Dos) {
- if ((strposch('*',itm->selact) >= 0) || (strposch('?',itm->selact) >= 0))
- dirpick(ts,itm->selact,DirIncl,DirExcl,0,0);
- else
- dirpick(ts,"*.EXE,*.COM,*.BAT",DirIncl,DirExcl,0,0);
- }
- else
- ts[0] = '\0';
- }
- else
- strip(ts,itm->selact);
- if ((itm->seltyp != _Dos) && (ts[0] != '\0')) {
- strconcat(tts,lookalong,";",datapath,NULL);
- fsearch(ts,ts,tts);
- if (ts[0] == '\0')
- strip(ts,itm->selact);
- }
- getcline(cl,itm->seltyp,ts,itm->selcmd);
- if (replmacro(cl)) {
- if ((ts[0] != '\0') && (exitcode != QitKey)) {
- for (b = 0; b < MaxMnus; b++) {
- if ((m->mat[b] != NULL) && (m->mat[b]->winp != NULL))
- closewin(&m->mat[b]->winp);
- }
- clrscr();
- dummy_exec(ts,cl);
- clrscr();
- dispallwin();
- jumptomnu(m,m->curmnu->mno);
- }
- }
- break;
- case _OShell :
- for (b = 0; b < MaxMnus; b++) {
- if ((m->mat[b] != NULL) && (m->mat[b]->winp != NULL))
- closewin(&m->mat[b]->winp);
- }
- clrscr();
- cwrite("\r\n"); cwrite(_ShellMsge); cwrite("\r\n"); cwrite("\r\n");
- dummy_exec(getenvstr(ts,"COMSPEC"),"");
- clrscr();
- dispallwin();
- jumptomnu(m,m->curmnu->mno);
- break;
- case _Proc : do_proc((int) ival(itm->selact),m); break;
- case _Quit : quit = True; break;
- }
- if (savdir[0] != '\0') {
- changeto(savdir,&i);
- savdir[0] = '\0'; i = 0;
- }
- }
- }
- }
-
- bool initdbm(void)
- {
- int i,slen;
- string ts;
- pathstr menspec;
- findrec s;
-
- smc = NULL;
- autom = 0; autop[0] = '\0';
- get_pat_n_nam(dm.mnufnam,MnuExt);
- restoremnuchain();
- for (i = 1; i < paramcount(); i++) {
- if (strposstr("-AE",paramstr(i)) == 0) {
- autom = (byte) ival(strcopy(ts,paramstr(i),3,strlen(paramstr(i))-3));
- if (i < paramcount()-1) strcpy(autop,paramstr(i+1));
- }
- }
- slen = strlen(autop);
- for (i = 0; i < slen ; i++)
- if (autop[i] == 0xA8) autop[i] = ' ';
- if (!exists(dm.mnufnam)) {
- autom = 0; autop[0] = '\0';
- strcpy(ts,datapath);
- slen = strlen(ts);
- if (ts[slen-1] == '\\')
- ts[slen-1] = '\0';
- strconcat(menspec,ts,"\\*",MnuExt,NULL);
- if (db_findfirst(menspec,&s,A_ANYFILE)) {
- strconcat(dm.mnufnam,ts,"\\",s.name,NULL);
- if (db_findnext(&s)) {
- dirpick(ts,menspec,DirIncl,DirExcl,0,0);
- strip(dm.mnufnam,ts);
- }
- }
- }
- initmnu(&dm,0,0,OnDisk);
- return ((bool) (dm.curmnu != NULL));
- }
-
- void main(void)
- {
- string ts;
- uchar def[2],pic[2];
-
- db_curs_init();
- db_date_init();
- db_funcs_init();
- db_heap_init();
- db_gvar_init();
- if (i_alloc) exit(0);
- db_key_init();
- db_pswd_init();
- db_win_init();
- db_mnu_init();
- db_man_init();
- db_util_init();
- if (!dbcaller) {
- clrscr();
- cwrite(LSC_StartVia);
- cwrite(" STARTMB.BAT");
- cwrite("\r\n");
- exit(1); /* Must be run by MB.EXE via STARTMB.BAT */
- }
- initedit();
- deltas = def1.deltat;
- savdir[0] = '\0';
- getenvstr(tmpfilesdir,"ESPATH");
- if (empty(tmpfilesdir) || (!path_ok(tmpfilesdir)))
- strcpy(tmpfilesdir,thisprog.fdir);
- pathSwap = True;
- strconcat(batchloop,"_",strcopy(ts,getenvstr(ts,"MBSTN"),0,3),"LOOP.BAT",NULL);
- set_addmember(ExitSet,AltX);
- if (initdbm()) {
- loadmanual();
- clrscr();
- dispallwin();
- quit = False;
- if (autom != 0) {
- jumptomnu(&dm,autom);
- do
- dm.curitm = dm.curitm->nitm;
- while ((strcmp(autop,dm.curitm->prompt) != 0) && (dm.curitm != dm.curmnu->fitm));
- }
- else
- dspmnu(&dm,dm.curmnu);
- do {
- if (pathSwap) datenpath();
- if (dm.curitm->sec > gvar->sec) {
- if (dm.curmnu->mtyp == Vert) goud(&dm,Down); else gorl(&dm,Right);
- }
- hbar(&dm);
- while (!kpressed()) {
- if (mtime.x != 0) writewxy(get_time(ts,mtime.m),0,mtime.x,mtime.y,NULL);
- if (mksta.x != 0) writewxy(keystat(ts,0),0,mksta.x,mksta.y,NULL);
- }
- ctlkey = upperch(getkey());
- if ((dm.curitm->sec > gvar->sec) &&
- ((ctlkey != AltX) && (ctlkey != AltL) && (ctlkey != QitKey)))
- dberrm(LSC_MustLogOn);
- if (((ctlkey == DArr) && (!mousekey)) &&
- ((dm.curmnu->mtyp != Vert) && (dm.curitm->seltyp == _Menu)))
- ctlkey = Enter;
- if ((ctlkey == QitKey) && (backjump == 0) &&
- ((dm.curmnu == NULL) || (dm.curmnu->pmnu == 0))) ctlkey = AltX;
- if (set_member(dm.mnualtset,ctlkey))
- processalt(ctlkey,&dm,do_ctl);
- else switch (ctlkey) {
- case QitKey : if (backjump > 0) {
- jumptomnu(&dm,backjump); backjump = 0;
- }
- else if ((dm.curmnu != NULL) && (dm.curmnu->pmnu != 0)) {
- zapmnu(&dm,dm.curmnu);
- dm.curmnu->litm = dm.curitm;
- dm.curmnu = dm.mat[dm.curmnu->pmnu-1];
- dm.curitm = dm.curmnu->litm;
- dm.level = 0;
- if (dm.curmnu->winp == NULL) dspmnu(&dm,dm.curmnu);
- } break;
- case UArr : goud(&dm,Up); break;
- case DArr : goud(&dm,Down); break;
- case LArr : gorl(&dm,Left); break;
- case RArr : gorl(&dm,Right); break;
- case Enter : if (gvar->sec >= dm.curitm->sec) {
- if ((backjump > 0) && (dm.curitm->seltyp != _Proc)) backjump = 0;
- do_ctl(&dm,dm.curitm);
- if (backjump > 0) {
- jumptomnu(&dm,backjump); backjump = 0;
- }
- } break;
- case HlpKey : itemhelp(&dm); break;
- case Home : firstitm(&dm); break;
- case EndKey : lastitm(&dm); break;
- case AltV : setdeltas(); break;
- case AltX : quit = True; break;
- case AltL :
- logon();
- for (gb = 0; gb < MaxMnus; gb++)
- if ((dm.mat[gb] != NULL) && (dm.mat[gb]->winp != NULL)) {
- zapmnu(&dm,dm.mat[gb]); dspmnu(&dm,dm.mat[gb]);
- }
- break;
- case AltU : updpasswords(); break;
- case AltS :
- rubpath();
- editdatapath();
- pathSwap = True;
- break;
- default :
- if (selitm(ctlkey,&dm)) {
- hbar(&dm);
- if ((backjump > 0) && (dm.curitm->seltyp != _Proc)) backjump = 0;
- do_ctl(&dm,dm.curitm);
- if (backjump > 0) {
- jumptomnu(&dm,backjump); backjump = 0;
- }
- }
- break;
- }
- if (quit && (smc != NULL)) {
- disposemnus(&dm);
- svm = smc->savprv;
- strcpy(dm.mnufnam,smc->savnam);
- if (smc->savpath[0] != '\0') changeto(smc->savpath,&res);
- initmnu(&dm,0,0,OnDisk); dispallwin();
- if (dm.curmnu != NULL) {
- loadmanual();
- pathSwap = True;
- jumptomnu(&dm,smc->savno);
- do
- dm.curitm = dm.curitm->nitm;
- while ((strcmp(smc->savprompt,dm.curitm->prompt) != 0) &&
- (dm.curitm != dm.curmnu->fitm));
- quit = False;
- }
- db_free(smc); smc = svm;
- }
- if (quit) {
- dbgetstr(ts,_Ch,LSC_QuitProgram,chstr(def,_YES),chstr(pic,Pic_U),"",chkyesno,nohelp);
- quit = (bool) ((ts[0] == _YES) && (exitcode != QitKey));
- }
- } while (!quit);
- disposemnus(&dm);
- }
- else {
- writewxy(centre(ts,LSC_NoMenu,80),15,1,25,NULL);
- delayorkey(2.0);
- }
- erasebatch();
- if (deltas != def1.deltat) {
- def1.deltat = (byte)deltas;
- updexe(def1.exeid,sizeof(def1));
- }
- clrscr(); gotoxy(1,25);
- }
-